昨天我們實作策略迭代 (Policy Iteration),在實作中,我們重複進行「策略評估」與「策略增進」這兩個步驟。那麼,我們有沒有辦法把這兩個步驟合併嗎?
這個方法希望將「策略評估」與「策略增進」這兩個步驟合併。價值評估函數的形式,我們在 Day 9 說明貪婪法時,已經呈現過。
只是在策略迭代的方法中,我們使用「策略增進」來決定最佳的動作,並送到「策略評估」中。然而在價值迭代的方法中,我們在評估狀態價值時,不再像「策略評估」只執行最好的動作,而是計算所有動作,並選擇價值最高者,做為新的狀態價值。演算法如下所示:
(取自 Sutton 書籍)
不好意思,今天才注意到 Sutton 網路版與 pdf 版的符號表示不同,找個時間會回去更新。
以下分成三個部分,來說明我們實作使用價值迭代於 GridWorld 的過程,完整程式請見 GitHub。
def ValueIteration(func_value, func_reward, trans_mat, gamma):
best_action = np.zeros(16)
func_value_now = func_value.copy()
for state in range(1,15):
next_state = trans_mat[:,state,:]
future_reward = func_reward + func_value*gamma
func_value[state] = np.max(np.matmul(np.transpose(next_state), future_reward))
best_action[state] = np.argmax(np.matmul(np.transpose(next_state), future_reward))
delta = np.max(np.abs(func_value - func_value_now))
return func_value, delta, best_action
值得注意的是,我們 不需要 考慮各狀態下各動作出現的機率,因為我們只選擇最好的動作。
def main():
## environment setting
# action
ProbAction = np.zeros([16,4])
ProbAction[1:15,:] = 0.25
# value function
FuncValue = np.zeros(16)
# reward function
FuncReward = np.full(16,-1)
FuncReward[0] = 0
FuncReward[15] = 0
# transition matrix
T = np.load('./gridworld/T.npy')
# parameters
gamma = 0.99
theta = 0.05
delta = delta = theta + 0.001
counter_total = 0
# iteration
while delta > theta:
counter_total += 1
os.system('cls' if os.name == 'nt' else 'clear')
ValueFunc, delta, BestAction = ValueIteration(FuncValue, FuncReward, T, gamma)
ShowValue(delta, theta, gamma, counter_total, FuncValue)
PolicyString = ShowPolicy(counter_total, BestAction)
time.sleep(2)
os.system('cls' if os.name == 'nt' else 'clear')
print('='*60)
print('Final Result')
print('='*60)
print('[State-value]')
print(FuncValue.reshape(4,4))
print('='*60)
print('[Policy]')
print(PolicyString.reshape(4,4))
print('='*60)
============================================================
Final Result
============================================================
[State-value]
[[ 0. 0. -1. -1.99]
[ 0. -1. -1.99 -1. ]
[-1. -1.99 -1. 0. ]
[-1.99 -1. 0. 0. ]]
============================================================
[Policy]
[['*' '<' '<' '<']
['^' '^' '^' 'v']
['^' '^' 'v' 'v']
['^' '>' '>' '*']]
============================================================
至此,我們將動態規劃方法中的「策略迭代」與「價值迭代」方法介紹完了。明天,我們來討論動態規劃方法的一些優缺點。